package model;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import model.ManejadorDeEstados;

/**
 * clase que representa el trabajo de un usuario
 */
public class Trabajo {
	
	//Variables de instancia
	
	private Usuario autor;
	private String titulo;
	private String resumen;
	private String archivoPDF;
	private List<String> areasInteres = new ArrayList<String>();
	private List<Usuario> listaDeRevisores = new ArrayList<Usuario>();
	private String estadoDeRevision = "Sin revisar";
	private List<EstadoDeCorreccion> notas = new ArrayList<EstadoDeCorreccion>();
	private EstadoDeCorreccion notaFinal;
	private ManejadorDeEstados observer;
	private CFP cfp;

	

	/**
	 * Constructor
	 * Crea una instancia de la clase 
	 * 
	 * @param titulo
	 * @param resumen
	 * @param autor
	 * @param archivo
	 * @param areas
	 */
	public Trabajo(String titulo,String resumen,Usuario autor,String archivo,List<String> areas){
	
		this.setAutor(autor);
		this.setTitulo(titulo);
		this.setResumen(resumen);
		this.setArchivoPDF(archivo);
		this.setAreasInteres(areas);
		
	}
	
	
	//Getters y setters
	


	public CFP getCfp() {
		return cfp;
	}
	public void setCfp(CFP cfp) {
		this.cfp = cfp;
	}
	public ManejadorDeEstados getObserver() {
		return observer;
	}
	public void setObserver(ManejadorDeEstados observer) {
		this.observer = observer;
	}
	public Usuario getAutor() {
		return autor;
	}
	public void setAutor(Usuario autor) {
		this.autor = autor;
	}
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public String getResumen() {
		return resumen;
	}
	public void setResumen(String resumen) {
		this.resumen = resumen;
	}
	public String getArchivoPDF() {
		return archivoPDF;
	}
	public void setArchivoPDF(String archivoPDF) {
		this.archivoPDF = archivoPDF;
	}
	public List<String> getAreasInteres() {
		return areasInteres;
	}
	public void setAreasInteres(List<String> areasInteres) {
		this.areasInteres = areasInteres;
	}
	public List<Usuario> getListaDeRevisores() {
		return listaDeRevisores;
	}
	public void setListaDeRevisores(List<Usuario> listaDeRevisores) {
		this.listaDeRevisores = listaDeRevisores;
	}
	public String getEstadoDeRevision() {
		return estadoDeRevision;
	}
	public void setEstadoDeRevision(String estadoDeRevision) {
		this.estadoDeRevision = estadoDeRevision;
	}
	public List<EstadoDeCorreccion> getNotas() {
		return notas;
	}
	public void setNotas(List<EstadoDeCorreccion> notas) {
		this.notas = notas;
	}
	public EstadoDeCorreccion getNotaFinal() {
		return notaFinal;
	}
	public void setNotaFinal(EstadoDeCorreccion notaFinal) {
		this.notaFinal = notaFinal;
	}
	
	/**
	 * Asigna al trabajo con los 3 revisores correspodientes
	 * @param rev1
	 * @param rev2
	 * @param rev3
	 */
	public void asignarRevisores(Usuario rev1, Usuario rev2, Usuario rev3){
		
		this.getListaDeRevisores().add(rev1);
		this.getListaDeRevisores().add(rev2);
		this.getListaDeRevisores().add(rev3);
	}
	
	/**
	 * asigna al trabajo con la lista de revisores dada
	 * @param revisores
	 */
	public void asignarRevisores(List<Usuario> revisores){
		this.getListaDeRevisores().addAll(revisores);
	}
	
	/**
	 * Aceota el trabajo
	 */
	public void aceptarTrabajo(){
		
		this.getNotas().add(new Aceptado(""));
		this.getObserver().actualizarEstado(this);
		
	}
	
	public void setManejadorDeEstado(ManejadorDeEstados manej){
		this.observer = manej;
	}
	
	/**
	 * Aceota un trabajo con un comentario
	 * @param comentario
	 */
	public void aceptarTrabajo(String comentario){
		
		this.getNotas().add(new Aceptado(comentario));
		this.getObserver().actualizarEstado(this);
		
	}
	
	/**
	 * rechaza el trabajo con un comentario
	 * @param comentario
	 */
	public void rechazarTrabajo(String comentario){
		
		this.getNotas().add(new Rechazado(comentario));
		this.getObserver().actualizarEstado(this);
	}
	
	/**
	 * Acepta el trabajo pero con modificacion y con un comentario
	 * @param comentario
	 */
	public void aceptarConModificacion(String comentario){
		
		this.getNotas().add(new AceptadoConModificacion(comentario));
		this.getObserver().actualizarEstado(this);
	}

	/**
	 * 
	 * @return estado de correccion en caso de estar en condiciones de hacerlo
	 * @throws NoEstaCorregidoException
	 */
	public EstadoDeCorreccion verCorreccion() throws NoEstaCorregidoException{
		if(this.getEstadoDeRevision()=="Revisado")
		{
			return this.getNotaFinal();
		}
		else
			{throw new NoEstaCorregidoException("El trabajo no esta corregido totalmente a�n");}
		
	}
	
	/**
	 * Muestra las correcciones de los otros revisores del trabajo si es que la fecha tope ya se cumplio
	 * @return
	 * @throws NoSeCumplioFechaDeCorreccionException
	 */
	public List<EstadoDeCorreccion> verCorreccionesDeOtros() throws NoSeCumplioFechaDeCorreccionException{
		Date fechaActual = new Date();
		if (this.getCfp().getFechaTopeDeRevision().before(fechaActual))//hablar que cosas hay que cambiar porque necesito saber la fecha actual.
			return this.getNotas();
		else
			throw new NoSeCumplioFechaDeCorreccionException("No se pueden mostrar las reviciones todavia");
		
	}
}
